////***************************************************************************************
//// MathHelper.h by Frank Luna (C) 2011 All Rights Reserved.
////
//// Helper math class.
////***************************************************************************************
//
//#ifndef MATHHELPER_H
//#define MATHHELPER_H
//
//#include <Windows.h>
//
//#include <DirectXMath.h>
//#include <DirectXPackedVector.h>
//using namespace DirectX;
//using namespace DirectX::PackedVector;
//
//class MathHelper
//{
//public:
//	// Returns random float in [0, 1).
//	static float RandF()
//	{
//		return (float)(rand()) / (float)RAND_MAX;
//	}
//
//	template<typename T>
//	static float AbsoluteValue(const T& value)
//	{
//		if(value < 0.0f)
//			return value * -1;
//		else
//			return value;
//	}
//
//	// Returns random float in [a, b).
//	static float RandF(float a, float b)
//	{
//		return a + RandF()*(b-a);
//	}
//
//	template<typename T>
//	static T Min(const T& a, const T& b)
//	{
//		return a < b ? a : b;
//	}
//
//	template<typename T>
//	static T Max(const T& a, const T& b)
//	{
//		return a > b ? a : b;
//	}
//	 
//	template<typename T>
//	static T Lerp(const T& a, const T& b, float t)
//	{
//		return a + (b-a)*t;
//	}
//
//	template<typename T>
//	static T Clamp(const T& x, const T& low, const T& high)
//	{
//		return x < low ? low : (x > high ? high : x); 
//	}
//
//	// Returns the polar angle of the point (x,y) in [0, 2*PI).
//	static float AngleFromXY(float x, float y);
//
//	static XMMATRIX InverseTranspose(CXMMATRIX M)
//	{
//		// Inverse-transpose is just applied to normals.  So zero out 
//		// translation row so that it doesn't get into our inverse-transpose
//		// calculation--we don't want the inverse-transpose of the translation.
//		XMMATRIX A = M;
//		A.r[3] = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f);
//
//		XMVECTOR det = XMMatrixDeterminant(A);
//		return XMMatrixTranspose(XMMatrixInverse(&det, A));
//	}
//
//	static XMVECTOR RandUnitVec3();
//	static XMVECTOR RandHemisphereUnitVec3(XMVECTOR n);
//
//	static void OrthoNormalInverse(XMFLOAT4X4& MatrixO, const XMFLOAT4X4& MatrixA);
//	static XMVECTOR& VectorByMatrixMult(XMVECTOR& vector, XMFLOAT4X4& matrix, XMVECTOR& returnVec);
//	static void InterpolateMatrices(XMFLOAT4X4& _prevFrame, XMFLOAT4X4& _nextFrame, float _lambda, XMFLOAT4X4& _result);
//
//	static float CalcGaussianBlurWeight(float x);
//
//	static const float Infinity;
//	static const float Pi;
//	static const float M_E;
//};
//
//#endif // MATHHELPER_H